// 1.无组合状态 只是正常的调用方法，从最里面开始执行
// async function fn1(next){
//     console.log('fn1')
//     console.log('end fn1')
// }

// async function fn2(next){
//     console.log('fn2')
//     console.log('end fn2')
// }

// function fn3(next){
//     console.log('fn3')
// }

// fn1(fn2(fn3())) 

// 结果
// fn3
// fn2
// end fn2
// fn1
// end fn1


// // 2.两个函数的组合，这里特点是参数是一个方法的声明
// // 没有使用()立刻执行fn()。留给函数内部执行next()
// async function fn1(next){
//     console.log('fn1')
//     next && await next()
//     console.log('end fn1')
// }
// //这里的fn2 的参数next 其实可以忽略没有用到。
// async function fn2(next){
//     console.log('fn2')
//     next && await next()
//     console.log('end fn2')
// }

// fn1(fn2)


// 结果
// fn1
// fn2
// end fn2
// end fn1
 

//3 多个函数的组合,
// 由于参数都需要是声明，而不是立即调用，
// 所以参数都要包裹成声明方式 () => {}
// 除了最后一个，因为最后一个就是定义不用再嵌套调用 ()
async function fn1(next){
    console.log('fn1')
    next && await next()
    console.log('end fn1')
}

async function fn2(next){
    console.log('fn2')
    next && await next()
    console.log('end fn2')
}
async function fn3(next){
    console.log('fn3')
    next && await next()
    console.log('fn3')
}

async function fn4(next){
    console.log('fn4')
    next && await next()
    console.log('fn4')
}


fn1(() => fn2(() => fn3(fn4)))
 

// 结果
// fn1
// fn2
// fn3
// fn4
// fn4
// fn3
// end fn2
// end fn1
